"""
核心模块 - 自定义类型

此模块定义了用于增强类型提示语义的、全项目通用的自定义数据类型。
"""
import json
from sqlalchemy.types import TypeDecorator, JSON


class BigInt(int):
    """
    一个用于类型注解的自定义类型，专门用于表示数据库中的 BIGINT 或雪花ID。

    虽然在运行时它和普通的 int 行为一致，但它为我们的类型系统和
    数据转换逻辑（例如，在 Pydantic 模型中将大整数转为字符串）
    提供了一个明确的、可识别的标记。
    """
    pass


class JsonStrAsDict(TypeDecorator):
    """
    一个自定义的 SQLAlchemy 类型装饰器，用于解决某些数据库驱动
    (如 aiomysql) 将 JSON 字段作为字符串返回的问题。

    它能自动将从数据库读出的字符串反序列化为 Python 字典。
    """
    impl = JSON
    cache_ok = True

    def process_bind_param(self, value, dialect):
        """在将值写入数据库时被调用"""
        if value is not None:
            # 如果传入的是字典，则序列化为JSON字符串
            if isinstance(value, dict):
                return json.dumps(value, ensure_ascii=False)
        return value

    def process_result_value(self, value, dialect):
        """在从数据库读取值时被调用"""
        if value is not None and isinstance(value, str):
            try:
                return json.loads(value)
            except (json.JSONDecodeError, TypeError):
                # 如果解析失败，返回原始字符串，让上层应用处理
                return value
        return value 